#include"cds_list.h"
#include"c_list.h"

#ifdef __cplusplus
extern "C" {
#endif

#define __add_size(list) ((list)->size++)
#define __sub_size(list) ((list)->size--)
//添加数据(链表尾部添加)
void clist_add(clist_t * list, void * data){
    clist_node_t * node = malloc(sizeof(clist_node_t));
    CLIST_NODE_INIT( node, data);
    list_add(&node->entry, &list->head.entry );
    __add_size(list);
}

//添加数据(头部添加)
void clist_add_head(clist_t * list, void * data){
    clist_node_t * node = malloc(sizeof(clist_node_t));
    CLIST_NODE_INIT( node, data);
    list_add_head(&node->entry, &list->head.entry );
    __add_size(list);
}

//删除数据(头部删除)
void * clist_del_first(clist_t * list){
    list_head_t * node_ptr = list_del_first(&list->head.entry);
    if(!node_ptr){
        debug("链表为空,没有数据了\n");
        return NULL;
    }
    clist_node_t * cnode = list_entry(node_ptr,clist_node_t,entry);
    void * data = cnode->data;
    free(cnode);
    __sub_size(list);    
    return NULL;
}

//删除数据(尾部删除)
void * clist_del_last(clist_t * list){
    list_head_t * node_ptr = list_del_last(&list->head.entry);
    if(!node_ptr){
        debug("链表为空,没有数据了\n");
        return NULL;
    }
    clist_node_t * cnode = list_entry(node_ptr,clist_node_t,entry);
    void * data = cnode->data;
    free(cnode);
    __sub_size(list);    
    return NULL;
}

//获取链表中的数据量
static inline int clist_size(clist_t * list){
   return list->size; 
}

//判断链表是否为空
static inline int clist_is_empty(clist_t * list ){
    return list_is_empty(&list->head.entry);
}

//清空链表
static inline void clist_clear(clist_t * list){
    list_clear(&list->head.entry);
}

#ifdef __cplusplus
}
#endif

